/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package agenda;

import agenda.entityes.TelNumber;
import java.awt.Color;
import java.awt.Component;
import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;
import javax.swing.table.*;

/**
 * Tabella usata per la modifica e l'inserimento di numeri di telefono.
 *
 *
 * Per ora e' questa classe che viene utilizzata per l'inserimento e la modifica dei numeri di telefono, pero' ho
 * cominciato a scrivere numTableModel (e faro' anche un numTableColumnModel) per evitare di estendere jTable , e fare
 * in modo che qualsiasi jTable alla quale applico i due modelli (TableModel e Column Model) si comporti come voglio io.
 *
 * Cmq ancora non sono del tutto convinto ... creare i due modelli vuol dire scrivere due classi, invece estendendo
 * jTable e con qualche trucchetto, tuto funziona (o dovrebbe funzionare) comunque.
 *
 * @author manu
 */
public class NumTable extends JTable {

    // editor per la colonna Tipo
    private JComboBox cb = new JComboBox(TelNumber.Type.values());
    private JTextField tf = new JTextField();

    public NumTable() {
        super();
        String[] cols = {"Tipo", "Numero"};
        DefaultTableModel dm = new DefaultTableModel(cols, 0);

        setModel(dm);
        // imposta i parametri della colonna 0
        DefaultTableColumnModel cm = new DefaultTableColumnModel();
        TableCellRenderer crender = new TableCellRenderer() {

            public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
                cb.setSelectedItem(value);
                return cb;
            }
        };

        /*
         * L'editor per la colonna 0 è un semplice comboBox che permette di scegliere il tipo di numero di telefono
         */
        TableCellEditor editor = new DefaultCellEditor(new JComboBox(TelNumber.Type.values()));
        cm.addColumn(new TableColumn(0, 10, crender, editor));
        cm.getColumn(0).setHeaderValue("Tipo");

        // imposta i parametri della colonna 1

        // come renderer uso un jTefxField (non formatted tanto non serve)
        crender = new TableCellRenderer() {

            public Component getTableCellRendererComponent(JTable jtable, Object o, boolean isSelected, boolean hasFocus, int r, int c) {
                tf.setText(o.toString());
                /*
                 * se la cella è selezionata imposta un bordo nero per dare un feedback visivo, altrimenti togli il
                 * bordo
                 */
                if (isSelected) {
                    tf.setBorder(new LineBorder(new Color(0)));
                } else {
                    tf.setBorder(new EmptyBorder(0, 0, 0, 0));
                }

                return tf;
            }
        };

        /*
         * e come al solito chi fa da se fa per tre -.-'....
         *
         * ho scritto la classe NumCellEditor e l'ho sostituita a DefaultCellEditor che usavo prima
         */
        editor = new NumCellditor();

        cm.addColumn(new TableColumn(1, 80, crender, editor));
        cm.getColumn(1).setHeaderValue("Numero");

        setColumnModel(cm);


        validate();
    }

    /**
     * Appende una riga vuota allafine della tabella.
     *
     */
    public void addRow() {
        Object[] arr = new Object[2];
        arr[0] = TelNumber.Type.Abitazione;
        arr[1] = "";

        ((DefaultTableModel) dataModel).addRow(arr);
    }

    /**
     * Appende una riga allafine della tabella.
     *
     * @param arr array contenente i dati da inserire nella riga
     */
    public void addRow(Object[] arr) {
        if (arr == null) {
            throw new IllegalArgumentException("arr non può essere null");
        }

        if (arr.length != 2) {
            throw new IllegalArgumentException("arr deve essere di lunghezza 2");
        }

        ((DefaultTableModel) dataModel).addRow(arr);
    }

    /**
     * Elimina una riga dalla tabella.
     *
     * Elimina la riga indicata da {param rowIndex} o l'ultima riga se {@code rowIndex} ha un valore minore di zero.
     *
     * @param rowIndex la riga da eliminare
     * @return
     */
    public void delRow(int rowIndex) {
        if (rowIndex < 0) {
            if (dataModel.getRowCount() == 0) {
                return ;
            }
            ((DefaultTableModel) dataModel).removeRow(((DefaultTableModel) dataModel).getRowCount() - 1);
            return;
        }
        ((DefaultTableModel) dataModel).removeRow(rowIndex);
    }

    /**
     * Rimuve tutte le righe presenti nella tabella.
     */
    public void clear() {
        for (int i = 0; i < getModel().getRowCount(); i++) {
            delRow(i);
        }
    }
}
